﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using ProjetoBe.cs;
using ProjetoBo.cs;
using ProjetoUtil;

namespace ProjetoForm
{
    public partial class CadastroCrianca : UserControl
    {

        private List<ResponsavelBe> ListaResponsaveisCadastrados = new List<ResponsavelBe>();
        private List<ResponsavelBe> ListaResponsaveisSelecionados = new List<ResponsavelBe>();
        private List<ResponsavelBe> ListaResponsaveisExistentes = new List<ResponsavelBe>();
        private List<ResponsavelBe> ListaTodosResponsaveis = new List<ResponsavelBe>();
        private List<CriancaBe> ListaBuscarCriancaPorData = new List<CriancaBe>();
        private CriancaBe criancaSelecionada;
        private CriancaBe crianca = new CriancaBe();
        private int idenficacao;
        private bool postBack = false;
        IngressoBo ingressoBo = new IngressoBo();
        CriancaBe inserirNovaCrianca = new CriancaBe();
        ResponsavelBo responsavelBo = new ResponsavelBo();
        DependenciaBo dependenciaBo = new DependenciaBo();
        CriancaBo criancaBo = new CriancaBo();
        Util util = new Util();

        public FlowLayoutPanel Conteudo { get; private set; }
        public CadastroCrianca(FlowLayoutPanel conteudo)
        {
            InitializeComponent();
            Conteudo = conteudo;
            responsavelBo.apagarTabelaTemporaria();
        }

        private void listLeaveData(object sender, EventArgs e)
        {
            if (!postBack)
            {
                ListaBuscarCriancaPorData = criancaBo.buscarCriancasPorData(txt_nascimento_busca.Text);
                postBack = true;
                box_nome.Items.Clear();
                box_nome.Items.Add("Novo Cadastro");

                if (ListaBuscarCriancaPorData.Count != 0)
                {
                    if (txt_nome.Text != "")
                        setarValoresNovoCadastro();
                    else
                        setarValoresCriancaCadastrada();
                }
                else
                {
                    setarValoresNovoCadastro();
                }
            }
        }

        private void box_nome_SelectedValueChanged(object sender, EventArgs e)
        {
            if (box_nome.SelectedItem.ToString() == "Novo Cadastro")
            {
                if (ListaBuscarCriancaPorData.Count != 0)
                {
                    panel_cadastroCrianca.Visible = true;
                    setarValoresNovoCadastro();
                    responsavelBo.apagarTabelaTemporaria();
                }
                else
                {
                    panel_cadastroCrianca.Visible = true;
                    setarValoresNovoCadastro();
                }
            }
            else
            {
                selecionarCrianca();
            }
        }


        private void btn_cadastrar_responsavel_Click(object sender, EventArgs e)
        {
            this.Visible = false;

            Forms.controleCadastroResponsavel = new cadastroResponsavel(this, Conteudo);
            Conteudo.Controls.Add(Forms.controleCadastroResponsavel);

            Forms.controleCadastroResponsavel.Inicializar();
            Refresh();
        }

        public void responsaveisCadastrados(List<int> ids)
        {
            ListaResponsaveisCadastrados = responsavelBo.buscarResponsaveisCadastrados(ids);

            foreach (ResponsavelBe item in ListaResponsaveisCadastrados)
            {
                responsavelBo.inserirTabelaTemporaria(item);
            }

            foreach (ResponsavelBe item in ListaResponsaveisExistentes)
            {
                responsavelBo.inserirTabelaTemporaria(item);
            }

            grid_responsaveis.DataSource = responsavelBo.retornarTabelaTemporaria();
        }

        private void grid_responsaveis_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            try
            {
                if (e.ColumnIndex.Equals(grid_responsaveis.Columns[e.ColumnIndex].Index))
                {
                    ResponsavelBe Responsavel = (ResponsavelBe)grid_responsaveis.Rows[e.RowIndex].DataBoundItem;

                    grid_responsaveis.CurrentRow.DefaultCellStyle.BackColor = Color.Orange;

                    if (!ListaResponsaveisSelecionados.Contains(Responsavel))
                    {
                        ListaResponsaveisSelecionados.Add(Responsavel);
                    }
                    else
                    {
                        removeResponsavel(Responsavel);
                    }
                }
            }
            catch{};
        }

        private void chk_restricao_Click(object sender, EventArgs e)
        {
            if (chk_restricao.Checked)
            {
                txt_restricoes.Enabled = false;
                txt_restricoes.Text = "Não possui restrições";
            }
            else
            {
                txt_restricoes.Enabled = true;
                txt_restricoes.Text = "";
            }
        }

        public void cadastroRealizadoSucesso()
        {
            string caption = "Cadastro Crianca";
            string mensg = "Cadastro realizado com sucesso !";
            var result = MessageBox.Show(mensg, caption, MessageBoxButtons.OK, MessageBoxIcon.Question);

            if (result == DialogResult.OK)
            {
                this.Visible = false;
                if (Forms.controleCadastroIngresso == null)
                {
                    Forms.controleCadastroIngresso = new CadastroIngresso(Conteudo);
                    Conteudo.Controls.Add(Forms.controleCadastroIngresso);
                }
                Forms.controleCadastroIngresso.Visible = true;
                this.Refresh();
            }
        }

        public void limparTela()
        {
            txt_count.Text = string.Empty;
            txt_nascimento_cadastro.Text = string.Empty;
            txt_nascimento_busca.Text = string.Empty;
            txt_nome.Text = string.Empty;
            txt_restricoes.Text = string.Empty;
            box_nome.Text = string.Empty;
            chk_restricao.Checked = false;
            List<ResponsavelBe> clearGrid = new List<ResponsavelBe>();
            grid_responsaveis.DataSource = clearGrid;
        }

        public void setarValoresNovoCadastro()
        {
            btn_nova_crianca.Enabled = true;
            btn_dependencia.Enabled = false;
            txt_nascimento_cadastro.Text = txt_nascimento_busca.Text;
            txt_count.Text = 0.ToString();
            box_nome.Text = "Realize o cadastro";
        }

        public void setarValoresCriancaCadastrada()
        {
            box_nome.Text = "Selecione aqui";
            btn_dependencia.Enabled = true;
            btn_nova_crianca.Enabled = false;


            foreach (CriancaBe i in ListaBuscarCriancaPorData)
                box_nome.Items.Add(i.nome);
        }

        public CriancaBe cadastrarCrianca()
        {
            CriancaBe criancaBe = new CriancaBe();

            if (txt_nome.Text != string.Empty)
                criancaBe.nome = txt_nome.Text;

            if (txt_count.Text != string.Empty)
                criancaBe.count = Convert.ToInt32(txt_count.Text);

            if (txt_nascimento_cadastro.Text != string.Empty)
                criancaBe.nascimento = Convert.ToDateTime(txt_nascimento_cadastro.Text);

            if (txt_restricoes.Text != string.Empty)
                criancaBe.restricoes = txt_restricoes.Text;

            crianca = criancaBo.inserirCrianca(criancaBe);

            return crianca;

        }

        public void selecionarCrianca()
        {
            panel_cadastroCrianca.Visible = true;

            foreach (CriancaBe item in ListaBuscarCriancaPorData)
            {
                if (box_nome.SelectedItem.Equals(item.nome))
                    criancaSelecionada = item;
            }

            txt_nome.Text = criancaSelecionada.nome;

            txt_nascimento_cadastro.Text = criancaSelecionada.nascimento.ToString();

            txt_restricoes.Text = criancaSelecionada.restricoes;

            txt_count.Text = criancaSelecionada.count.ToString();

            grid_responsaveis.DataSource = responsaveisDestaCrianca(criancaSelecionada.id);

        }

        public void criarDependencia(List<ResponsavelBe> responsaveis, int idCrianca, DateTime data)
        {
            idenficacao = dependenciaBo.gerarIdentificacaoDependencia();
            foreach (ResponsavelBe item in responsaveis)
            {
                DependenciaBe dependencia = new DependenciaBe();
                dependencia.idResponsavel = item.id;
                dependencia.id_crianca = idCrianca;
                dependencia.data = data;
                dependencia.identificacao = idenficacao;
                dependenciaBo.criarNovaDepencia(dependencia);
            }
        }

        public void removeResponsavel(ResponsavelBe objeto)
        {
            string pergunta = "Deseja remover responsavel ?";
            string atenção = "Atenção";

            var result = MessageBox.Show(pergunta, atenção, MessageBoxButtons.YesNoCancel);

            if (result == System.Windows.Forms.DialogResult.Yes)
            {
                grid_responsaveis.CurrentRow.DefaultCellStyle.BackColor = Color.White;
                ListaResponsaveisSelecionados.Remove(objeto);
            }
        }

        public void MensagemNumeroIdentificacao()
        {
            string caption = "Cadastro Crianca";
            string mensg = "NÚMERO DE IDENTIFICAÇÃO DO CADASTRO " + idenficacao.ToString();

            var result = MessageBox.Show(mensg, caption, MessageBoxButtons.OK, MessageBoxIcon.Question);

            if (result == DialogResult.OK)
            {
                limparTela();
                cadastroRealizadoSucesso();
            }
        }

        private void CadastrarNovaCrianca(object sender, EventArgs e)
        {
            if (validaCampos())
            {
                crianca = cadastrarCrianca();
                criarDependencia(ListaResponsaveisSelecionados, crianca.id, DateTime.Now);
                ingressoBo.inserirIngresso(ListaResponsaveisSelecionados, crianca.id, DateTime.Now, idenficacao);
                MensagemNumeroIdentificacao();
                responsavelBo.apagarTabelaTemporaria();
            }
            else
                MessageBox.Show("Verifique os campos em branco !");

        }

        public bool validaCampos()
        {
            bool campoEmBranco = true;

            if (txt_nome.Text == string.Empty)
                campoEmBranco = false;

            if (txt_count.Text == string.Empty)
                campoEmBranco = false;

            if (txt_nascimento_cadastro.Text == string.Empty)
                campoEmBranco = false;

            if (txt_restricoes.Text == string.Empty)
                campoEmBranco = false;

            if (ListaResponsaveisSelecionados.Count == 0)
                campoEmBranco = false;

            return campoEmBranco;
        }

        public List<ResponsavelBe> responsaveisDestaCrianca(int ID)
        {
            return ListaResponsaveisExistentes = responsavelBo.buscarResponsaveisDesativadosPorCriancaID(ID);
        }

        public List<ResponsavelBe> TodosResponsaveis()
        {
            if (ListaResponsaveisExistentes.Count == 0)
                return ListaResponsaveisCadastrados;

            ListaResponsaveisExistentes.Union(ListaResponsaveisCadastrados);

            return ListaResponsaveisExistentes;
        }

        private void btn_dependencia_Click(object sender, EventArgs e)
        {
            if (ListaResponsaveisSelecionados.Count == 0)
            {
                string mensg = "Selecione os responsaveis!";
                MessageBox.Show(mensg);
            }
            else
            {
                criarDependencia(ListaResponsaveisSelecionados, criancaSelecionada.id, DateTime.Now);

                ingressoBo.inserirIngresso(ListaResponsaveisSelecionados, criancaSelecionada.id, DateTime.Now, idenficacao);

                MensagemNumeroIdentificacao();

                responsavelBo.apagarTabelaTemporaria();
            }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            this.Visible = false;

            Forms.controleMenuHomeFuncionario = new menuHomeFuncionario(Conteudo);
            Conteudo.Controls.Add(Forms.controleMenuHomeFuncionario);

            Forms.controleMenuHomeFuncionario.Visible = true;
            this.Refresh();
        }
    }
}
